def solution(s, n):
upper_ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
answer = ""
for el_s in s:
#1.맨 마지막 리턴을 위해 원래 문자가 소문자인지 대문자인지 기억 and 대문자에서 검색할것이기 때문에 대문자로 변환
#대문자로 변환된 문자열 s의 각각의 문자,대소문자 여부
if el_s == " ":
answer += " "
elif el_s.isupper() == True:
was_upper = True
else:
was_upper = False
el_s = el_s.upper()
#2.인덱스 숫자가 upper_ch에서 벗어날때 아닐때 처리
for idx,up_ch in enumerate(upper_ch):
if el_s == up_ch and idx + n <= len(upper_ch)-1:
find_idx = idx+n
if was_upper == True:
answer += upper_ch[find_idx]
else:
answer += upper_ch[find_idx].lower()
elif el_s == up_ch and idx + n > len(upper_ch)-1:
find_idx = n-len(upper_ch[idx:])
if was_upper == True:
answer += upper_ch[find_idx]
else:
answer += upper_ch[find_idx].lower()
return answer
문제
나의 풀이
다른 풀이
def caesar(s, n):
lower_list = "abcdefghijklmnopqrstuvwxyz"
#소문자도 리스트로 만듦
#좋은점->대소문자 여부를 기억하는 코드 불필요(조건문)
#안좋은점->소문자로 이뤄진 리스트를 만드는데 그만큼의 메모리 필요
upper_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
result = []
#문자열들을 저장할 list를 만듦
#mutable로 붙이는 것과 immutable로 붙이는 것 차이
#속도 ->
#mutable이 더 빠름,
#그러나 garbage collector도 고려시 스캔범위가 너무커서 느려질수도?
#메모리 -> immutable이 더 적게들을 듯(리스트는 이중포인터같은 구조라서 이렇게 예상됨)
for i in s:
if i == " ":
result.append(" ")
elif i.islower() is True:
new_ = lower_list.find(i) + n
result.append(lower_list[new_ % 26])
#나머지로 계산하는 방식,이게 더 간단하고 좋은듯
#반복문이 문자열에 대해서 돌다보니 문자열과 문자열의 인덱스 위주로 너무 생각함
#어떤 숫자(여기서는 인덱스)보다 크거나 같을때에 다시 0부터 줘야하는 상황? -> 나머지 활용
else:
new_ = upper_list.find(i) + n
result.append(upper_list[new_ % 26])
return "".join(result)